ESP8266开发一个实时电子气象表(二)——天气获取

2022年1月15日 Jerry 2433 2023年11月6日

使用ESP8266开发一个实时电子气象表,主要实现功能有 时间、日期、星期、室内温湿度、天气预报等功能。

上一篇写了下关于 星期、时间、温湿度的获取与显示,这一篇讲一下如何通过网络获取天气信息。

1、天气信息:

天气信息来自 “心知天气”,注册后可以免费使用其API接口: 产品文档

获取实时天气,key换自己申请的KEY

http://api.seniverse.com/v3/weather/now.json?key=xxxxx&location=suzhou&language=zh-Hans

{
    "results": [{
        "location": {
            "id": "WTTDPCGXTWUS",
            "name": "苏州",
            "country": "CN",
            "path": "苏州,苏州,江苏,中国",
            "timezone": "Asia/Shanghai",
            "timezone_offset": "+08:00"
        },
        "now": {
            "text": "晴",
            "code": "0",
            "temperature": "7"
        },
        "last_update": "2022-01-15T11:48:06+08:00"
    }]
}

arduinuo如何发起请求并解析json信息呢? 代码DEMO如下:

#include <ESP8266HTTPClient.h>

void getWeather()
{
    WiFiClient tcpClient;
    HTTPClient httpClient;

    httpClient.begin(tcpClient, "http://api.seniverse.com/v3/weather/now.json?key=xxx&location=suzhou&language=zh-Hans"); 
    int httpCode = httpClient.GET();
    if (httpCode == HTTP_CODE_OK) 
    {
      String Payload = httpClient.getString();      // 使用getString函数获取服务器响应体内容

      // Allocate the JSON document
      // Use https://arduinojson.org/v6/assistant to compute the capacity.
      StaticJsonDocument<512> doc;

      DeserializationError error = deserializeJson(doc, Payload);

      if (error) {
        Serial.print(F("deserializeJson() failed: "));
        Serial.println(error.f_str());
        return;
      }

      JsonObject results_0 = doc["results"][0];
      JsonObject results_0_now = results_0["now"];
      const char* nowWeatherCode1 = results_0_now["code"]; // 
      const char* results_0_last_update = results_0["last_update"];

    } 
    else 
    {
      Serial.print("\r\nServer Respose Code: ");
      Serial.println(httpCode);
      String Payload = httpClient.getString();
      Serial.println(Payload);
    }

    /* 5. 关闭ESP8266与服务器的连接 */
    httpClient.end();

}

对于json的解析,这里提供了一个网址,可以直接生成代码:https://arduinojson.org/v6/assistant     填写相关信息后,最后能直接生成json解析代码,非常方便!

直接把代码考进去就完事,最后解析得到想要的信息。其他获取明后天天气预报方法类似。

2、关于 页面自动切换(时间-明天天气-后天天气)

这里用到了 ESP8266内置的定时器库--Ticker库

void once(float seconds, callback_function_t callback);     xx秒后只执行一次-----不带参数

void once(float seconds, callback_function_t callback,TArg arg);     xx秒后只执行一次-----带参数

void once_ms(float seconds, callback_function_t callback)     xx毫秒后只执行一次

void once_ms(float seconds, callback_function_t callback,TArg arg)     xx毫秒后只执行一次

void attach(float seconds, callback_function_t callback);     每隔xx秒周期性执行

void attach(float seconds, callback_function_t callback,TArg arg);     每隔xx秒周期性执行

void attach_ms(float seconds, callback_function_t callback);    每隔xx毫秒周期性执行

void attach_ms(float seconds, callback_function_t callback,TArg arg);    每隔xx毫秒周期性执行

于是,切换的方法如下:

#include <Ticker.h>

Ticker changeShow;
int changeShowInt = 0;

void tickerchangeShowInt()
{
    changeShowInt++;
}

void setup() {
    changeShow.attach(1, tickerchangeShowInt);
}

void loop() {

    //显示 8s 时间
    if(changeShowInt<=8)
    {
      showTime();
    }
    // 显示4s 明日天气
    else if(changeShowInt<=12)
    {
      showWeather(winfo[0]);
    }
    // 显示 4s 后天天气
    else if(changeShowInt<=16)
    {
      showWeather(winfo[1]);
    }
    //重置
    else
    {
      changeShowInt=0;
    }
}

完结!


原创文章,转载请注明出处: https://jerrycoding.com/article/esp8266-clock-2

微信
jerry微信赞助
支付宝
jerry支付宝赞助

您尚未登录,暂时无法评论。请先 登录 或者 注册

0 人参与 | 0 条评论